import random
import jieba  # 新增：导入中文分词库
from flask import Flask, render_template, request, jsonify
import pandas as pd
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics.pairwise import linear_kernel
import os

app = Flask(__name__)

# 获取当前文件所在目录
current_dir = os.path.dirname(os.path.abspath(__file__))
# 构建CSV文件路径（确保products.csv在data目录下）
csv_path = os.path.join(current_dir, 'data', 'products.csv')

# 加载商品数据
try:
    products = pd.read_csv(csv_path)
    # 新增：处理空值（避免后续报错）
    products = products.fillna('')
    print(f"成功加载数据，共 {len(products)} 条商品记录")
except Exception as e:
    print(f"加载数据失败: {e}")
    products = pd.DataFrame(columns=['id', 'title', 'price', 'sales', 'rating', 'attributes', 'image_url'])


# 新增：中文分词函数
def chinese_tokenizer(text):
    return jieba.lcut(text)  # 精确分割中文文本


# 创建搜索索引（优化中文处理）
if not products.empty:
    # 合并标题和属性为统一文本特征，增强匹配维度
    products['combined_features'] = products['title'] + ' ' + products['attributes']
    # 配置TF-IDF：支持中文分词，过滤中文停用词
    tfidf = TfidfVectorizer(
        tokenizer=chinese_tokenizer,  # 使用中文分词
        stop_words=['的', '是', '在', '等', '英寸', 'GB'],  # 中文停用词
        ngram_range=(1, 2)  # 支持1-2元分词（如“手机”“5G手机”）
    )
    tfidf_matrix = tfidf.fit_transform(products['combined_features'])
else:
    tfidf = None
    tfidf_matrix = None


def search_products(query, top_n=10):
    """优化后的搜索函数：提升中文关键词匹配精度"""
    if products.empty or tfidf is None:
        return []

    # 1. 计算文本相关性（使用优化后的TF-IDF）
    query_vec = tfidf.transform([query])
    cosine_similarities = linear_kernel(query_vec, tfidf_matrix).flatten()

    # 2. 过滤低相关性结果（仅保留相关度>0.1的商品）
    results = products.copy()
    results['relevance'] = cosine_similarities
    results = results[results['relevance'] > 0.1]  # 过滤无关商品

    # 3. 综合排序（相关性优先，辅以销量和评分）
    results['popularity'] = results['sales'] / results['sales'].max() * 0.2  # 销量权重20%
    results['rating_score'] = results['rating'] / 5 * 0.1  # 评分权重10%
    results['final_score'] = results['relevance'] * 0.7 + results['popularity'] + results['rating_score']  # 相关性权重70%

    # 4. 返回排序后的结果
    return results.sort_values('final_score', ascending=False).head(top_n).to_dict('records')


# 路由保持不变
@app.route('/')
def index():
    return render_template('index.html')


@app.route('/search')
def search():
    query = request.args.get('q', '').strip()
    results = search_products(query)
    return jsonify(results)


@app.route('/suggest')
def suggest():
    # 建议功能可保持不变，或同步优化中文处理
    query = request.args.get('q', '').lower()
    if not query:
        return jsonify([])
    # 模拟建议数据（实际可基于分词结果生成）
    title_suggestions = [title for title in products['title'] if query in title.lower()]
    related_suggestions = [f"{query} 手机", f"{query} 新款", f"{query} 官方正品"]
    all_suggestions = list(set(title_suggestions + related_suggestions))[:10]
    return jsonify([{"text": s, "count": random.randint(100, 10000)} for s in all_suggestions])


if __name__ == '__main__':
    # 确保数据目录存在
    data_dir = os.path.join(current_dir, 'data')
    os.makedirs(data_dir, exist_ok=True)
    app.run(debug=True, port=5001)